iT邦幫忙

2023 iThome 鐵人賽

DAY 21
0

今天把第三個 Model 的 DELETE 做完,還要在 store-list 的頁面印出 商店有販賣哪些產品

連結

先來整理一下等等會用到的一些頁面

<!-- 商店列表頁 -->
http://127.0.0.1:8000/online/product/2/delete/

urls.py

url 設定

# online/urls.py

urlpatterns += [
    path("product/<int:pk>/delete/", views.ProductDelete.as_view(), name="product-delete"),    
]

views.py

路徑設定好了,接下來當然是收發 request/responseviews.py 檔案:

# online/views.py

# ... 省略
from .models import Employer, Store

class ProductDelete(DeleteView):
    model = Product
    success_url = reverse_lazy('product-list')

這邊則是設定好剛剛路徑指定的 views.py,這邊跟之前差不多,所以就不再多說

templates - Product DELETE

  1. 在新增 delete 頁面前,我們先把在 product-list 頁面的資訊先更新一下,就可以在列表頁就刪除指定的物件
<!-- store/online/templates/online/product_list.html -->

{% extends 'sidebar.html' %}

{% block content %}
  <h1>產品列表</h1>
  {% for product in product_list %}
    <ul>
      <li>
        <a href="{{ product.get_absolute_url }}">產品ID</a>: {{ product.id }}         
      </li>      
      <li>產品名: {{ product.title }}</li>            
      <li>價錢: {{ product.price }}</li>            
      <li><a href="{% url 'product-delete' product.id %}">刪除產品</a></li>
    </ul>
  {% endfor %}
  
  <br>
  <a href="{% url 'product-create' %}">新增產品</a>
{% endblock %}
  1. 新增 http://127.0.0.1:8000/online/product/1/delete/ 頁面資料

還記得 DELETE 對應的 templates 是哪一個嗎?沒錯,就是這個 online/templates/online/product_confirm_delete.html

<!-- online/templates/online/product_confirm_delete.html -->

{% extends 'sidebar.html' %}

{% block content %}
  <h2>刪除產品頁面</h2>

  <form action="" method="post">
    {% csrf_token %}
    <input type="submit" value="submit">
  </form>
{% endblock %}

這樣設定好後,就可以經由 product-list 設定好的刪除連結,進入刪除頁面,我們先來看下圖:
https://ithelp.ithome.com.tw/upload/images/20231002/201623655oMskodNJg.png

接著最後成功刪除後,就會回到 http://127.0.0.1:8000/online/products/ 也就是 product-list 頁面,這樣我們就完成 Product 產品 的 CRUD 了!!

store.product_set.all

昨天我們做的事情是,在 product-detail 的頁面,把產品在哪些商店販賣都抓了出來,現在我們要反過來,到 store-list 的頁面,把每一間商店都販賣哪些產品都抓出來!
Ps. 要記得多新增幾個產品、商店喔,要不然會看不出來效果

新增好餐廳和老闆後,接著來修改以下檔案:

<!-- store/online/templates/online/store_list.html -->

{% extends 'sidebar.html' %}

{% block content %}
  <h1>商店列表</h1>
  {% for store in store_list %}
    <!-- ...省略 -->
    <p>商店賣的產品</p>
    {{ store.product_set.all }}
    <br>
    {% for product in store.product_set.all %}
    <ul>
      <li>產品名稱:{{ product.title }}</li>
      <li>產品價錢:{{ product.price }}</li>
    </ul>    
    {% endfor %}
    <hr>
  {% endfor %}
  
  <br>
  <a href="{% url 'store-create' %}">新增商店</a>
{% endblock %}

這樣修改後,會看到以下的圖:
https://ithelp.ithome.com.tw/upload/images/20231002/20162365FJz3Nk97yh.png

我在這邊多做了兩件事:

  1. store.product_set.all 印出這間商店所有的 Product
  2. 用迴圈把產品陣列資訊全部抓出來

可以發現我們在 Store 頁面,因為我們有牽關聯的關係,用 Store 物件可以印出 product 物件,而這個跟我們在 product 頁面印出 store 物件有一點小小的不一樣,不一樣的地方就在於,如果今天你要 反查,就像今天用 store 物件查 product 物件一樣,要使用 store.product_set.all(),這樣才能抓得到,如果今天你這樣寫 store.product,這樣是無法印出來的喔!!

總結

今天學到哪些東西呢?

  1. 第三個 Model 的 DELETE
  2. 在 Store 頁面印出 Product 物件 - store.product_set.all()

最後附上 Github: https://github.com/eagle0526/Django-store


上一篇
DAY20 - Product CRUD 的 READ 和 UPDATE
下一篇
DAY22 - 首頁 index.html 頁面設定
系列文
Django 初學入門 - 從 ROR 的角度來學習 Django30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言